/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import clases.EstadoRevista;
import clases.Revista;
import clases.Seccion;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Rafa
 */
public class DAO_Revista {

    Session sesion = null;

    public DAO_Revista() {
        this.sesion = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public List<Revista> consultaRevistas(boolean iniciar) {
        List<Revista> listaRevistas = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se realiza la consulta
            Query q = sesion.createQuery("from Revista");

            //Se recoge el resultado de la consulta
            listaRevistas = (List<Revista>) q.list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return listaRevistas;
    }

    public int consultaUltimoNumeroRevista(boolean iniciar) {
        int numRevista = -1;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("select max(numero) from Revista");
        //query.setParameter("numero", numero);

            //Se recoge el resultado de la consulta
            numRevista = (int) query.uniqueResult();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return numRevista;
    }

    public Revista consultaUltimaRevista(boolean iniciar) {
        Revista revista = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("select max(idRevista) from Revista");

            //Se recoge el resultado de la consulta
            revista = (Revista) query.uniqueResult();

        } catch (Exception e) {
            e.printStackTrace();

        }
        return revista;
    }

    public Revista consultaRevistaPorNumero(int numero, boolean iniciar) {
        Revista revista = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from Revista where numero = '" + numero + "'");
        //query.setParameter("numero", numero);

            //Se recoge el resultado de la consulta
            revista = (Revista) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return revista;
    }

    public Revista consultaRevistaPorId(Integer idRevista, boolean iniciar) {
        Revista revista = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            //Se hace la consulta
            Query query = sesion.createQuery("from Revista where idRevista = '" + idRevista + "'");
        //query.setParameter("numero", numero);

            //Se recoge el resultado de la consulta
            revista = (Revista) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return revista;
    }

    public Revista consultaRevistaActiva(boolean iniciar) {
        Revista revista = null;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            DAO_EstadoRevista daoEstado = new DAO_EstadoRevista();
            int est = daoEstado.consultaEstadoRevistaActiva(true).getIdEstadoRevista();
            //Se hace la consulta
            Query query = sesion.createQuery("from Revista where estado = '" + est + "'");

            //Se recoge el resultado de la consulta
            revista = (Revista) query.uniqueResult();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return revista;
    }

    public Revista insertaRevista(String[] secciones, String fecha, boolean iniciar) {
        Revista revista = null;
        int numRevista;

        try {
            if (iniciar) {
                sesion.beginTransaction();
                //Se calcula el ultimo numero y se le suma 1
                numRevista = consultaUltimoNumeroRevista(false);
            } else {
                numRevista = consultaUltimoNumeroRevista(true);
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            if (numRevista >= 0) {

                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                Date parsed = format.parse(fecha);
                java.sql.Date fechaPublicacion = new java.sql.Date(parsed.getTime());
                System.out.println(fechaPublicacion);
                //Consultamos el estado
                DAO_EstadoRevista daoEstadoRevista = new DAO_EstadoRevista();
                EstadoRevista estado = daoEstadoRevista.consultaEstadoRevista(Constantes.getREVISTA_ACTIVADA(), true);

                Set<Seccion> listaSecciones = new LinkedHashSet<>();
                //sesion.getSessionFactory().getCurrentSession().beginTransaction();

                for (int i = 0; i < secciones.length; i++) {
                    DAO_Seccion daoSeccion = new DAO_Seccion();
                    listaSecciones.add(daoSeccion.consultaSeccionPorId(Integer.parseInt(secciones[i]), true));
                }

                if (listaSecciones.size() > 0) {
                    if (listaSecciones.contains(null) == false) {
                        revista = new Revista(estado, numRevista + 1, fechaPublicacion, listaSecciones);
                        //revista.setSeccions();
                        sesion.save(revista);
                        sesion.getTransaction().commit();
                    }
                }
            }
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return revista;
    }

    public boolean modificarRevista(String idRevista, String estadoRevista, Set<Seccion> secciones, boolean iniciar) {
        boolean correcto = false;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            DAO_EstadoRevista daoEst = new DAO_EstadoRevista();

            Revista revista = consultaRevistaPorId(Integer.parseInt(idRevista), false);
            revista.setEstadoRevista(daoEst.consultaEstadoRevista(estadoRevista, true));
            revista.setSeccions(secciones);

            sesion.saveOrUpdate(revista);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();
        }

        return correcto;
    }

    public boolean actalizaEstadoRevista(Revista revista, String estadoRevista, boolean iniciar) {
        boolean correcto = false;
        try {
            if (iniciar) {
                sesion.beginTransaction();
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();

            DAO_EstadoRevista daoEst = new DAO_EstadoRevista();

            revista.setEstadoRevista(daoEst.consultaEstadoRevista(estadoRevista, true));

            sesion.saveOrUpdate(revista);
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();
        }

        return correcto;
    }

    public boolean eliminaRevista(String idSeccion, boolean iniciar) {
        boolean correcto = false;
        try {
            if (iniciar) {
                sesion.beginTransaction();
                sesion.delete(consultaRevistaPorId(Integer.parseInt(idSeccion), false));
            }else{
                sesion.delete(consultaRevistaPorId(Integer.parseInt(idSeccion), true));
            }
            //sesion.getSessionFactory().getCurrentSession().beginTransaction();
            
            sesion.getTransaction().commit();
            correcto = true;
        } catch (Exception e) {
            if (sesion.getTransaction() != null) {
                sesion.getTransaction().rollback();
            }
            e.printStackTrace();

        }
        return correcto;
    }
}
